package ManagerImage.entity;
import ManagerImage.Utils.FileNameUtil;
import ManagerImage.Utils.StatusUtil;
import javafx.scene.control.*;
import static ManagerImage.display.RootPane.*;

import java.io.File;
import java.io.IOException;
import java.nio.file.Files;
import java.util.ArrayList;
import java.util.List;
import java.util.Optional;
/**
 * from RootPane:
 * 所需变量->selectedImages  thumbnails  statusLabel
 * 所需函数->findThumbnailByFile(imageFile1);   initImages();
 */
public class ContextMenuManager {
    FileNameUtil fileNameUtil = new FileNameUtil();
    private List<File> copiedFiles=new ArrayList<>();; // 用于存储复制的文件
    private ContextMenu contextMenu;
    private File directory;
    StatusUtil statusUtil=new StatusUtil();
    public ContextMenuManager() {
        //状态栏更新标签
        createContextMenu();
    }
    private void createContextMenu() {
        contextMenu = new ContextMenu();

        MenuItem deleteItem = new MenuItem("删除");
        MenuItem copyItem = new MenuItem("复制");
        MenuItem pasteItem = new MenuItem("粘贴");
        MenuItem renameItem = new MenuItem("重命名");

        contextMenu.getItems().addAll(deleteItem, copyItem, pasteItem, renameItem);

        deleteItem.setOnAction(e -> handleDelete());
        copyItem.setOnAction(e -> handleCopy());
        pasteItem.setOnAction(e -> handlePaste());
        renameItem.setOnAction(e -> handleRename());
    }
    private void handleDelete() {
        if (selectedImages.size() > 0) {
            // 创建确认对话框
            Alert confirmationAlert = new Alert(Alert.AlertType.CONFIRMATION);
            confirmationAlert.setTitle("确认删除");
            confirmationAlert.setHeaderText("您确认要删除选中的文件吗？");
            confirmationAlert.setContentText("被删除的文件无法恢复。");

            // 添加确认和取消按钮
            ButtonType confirmButton = new ButtonType("确认");
            ButtonType cancelButton = new ButtonType("取消");
            confirmationAlert.getButtonTypes().setAll(confirmButton, cancelButton);

            // 显示对话框并等待用户响应
            Optional<ButtonType> result = confirmationAlert.showAndWait();
            if (result.isPresent() && result.get() == confirmButton) {
            for (File imageFile1 : new ArrayList<>(selectedImages)) { // 使用新数组，避免ConcurrentModificationException
                if (imageFile1.delete()) {
                    if (thumbnails.getChildren().remove(findThumbnailByFile(imageFile1))) {
                        statusUtil.updateStatus(statusLabel, "已删除: " + imageFile1.getName());
                        imageCount--;
                    } else {
                        statusUtil.updateStatus(statusLabel, "删除失败: ");
                    }
                }
            }
            selectedImages.clear(); // 清空选中的图片列表
            currentDirectoryLabel.setText(new File(currentPath).getName() + " | " + imageCount + "张图片");
            } else {
                // 用户选择了取消，不执行删除操作
                statusUtil.updateStatus(statusLabel, "删除操作已取消");
            }
        } else {
            statusUtil.updateStatus(statusLabel,"没有选中的文件可以删除");
        }
    }
    private void handleCopy() {
        if (selectedImages.size() > 0) {
            copiedFiles.clear(); // 清空之前复制的文件列表
            for (File imageFile1 : selectedImages) {
                copiedFiles.add(imageFile1); // 保存复制的文件
            }
            statusUtil.updateStatus(statusLabel,"已复制: " + selectedImages.size() + " 个文件");
        } else {
            statusUtil.updateStatus(statusLabel,"没有选中的文件可以复制");
        }
    }
    private void handlePaste() {
        if (copiedFiles.size() > 0) {
            for (File copiedFile : copiedFiles) {
                File newFile = new File(directory, copiedFile.getName());
                int count = 1;
                while (newFile.exists()) {
                    newFile = new File(directory, "copy(" + count + ")_" + copiedFile.getName());
                    count++;
                }
                try {
                    Files.copy(copiedFile.toPath(), newFile.toPath());
                    statusUtil.updateStatus(statusLabel,"已粘贴: " + copiedFile.getName() + " 到 " + newFile.getName());
                } catch (IOException ex) {
                    statusUtil.updateStatus(statusLabel,"粘贴失败: " + copiedFile.getName());
                }
            }
            selectedImages.clear();
            initImages();
            statusUtil.updateStatus(statusLabel, "加载完成: " + new File(currentPath).getName() + " | 图片个数: " + imageCount + " | 总大小: " + fileUtil.formatSize(totalSize));
            currentDirectoryLabel.setText(new File(currentPath).getName() + " | " + imageCount + "张图片");
        } else {
            statusUtil.updateStatus(statusLabel,"没有可粘贴的文件");
        }
    }
    private void handleRename() {
        if (selectedImages.size() == 1) {
            // 单选状态 - 直接输入新的文件名
            File imageFile_single = selectedImages.get(0);
            TextInputDialog dialog = new TextInputDialog(imageFile_single.getName());
            dialog.setTitle("重命名");
            dialog.setHeaderText("请输入新文件名:");
            dialog.setContentText("新文件名:");
            dialog.showAndWait().ifPresent(newName -> {
                // 保持原始扩展名
            String extension = fileNameUtil.getFileExtension(imageFile_single);
            File newFile = new File(imageFile_single.getParent(), newName + extension);
            if (imageFile_single.renameTo(newFile)) {
                System.out.println(imageFile_single.getName());statusUtil.updateStatus(statusLabel,"已重命名为: " + newFile.getName());
            } else {
                statusUtil.updateStatus(statusLabel,"重命名失败: " + imageFile_single.getName());
            }
                selectedImages.clear();
                initImages();
            });
        } else if (selectedImages.size() > 1) {
            // 多选状态 - 输入名称前缀和编号
            TextInputDialog prefixDialog = new TextInputDialog("NewName");
            prefixDialog.setTitle("批量重命名");
            prefixDialog.setHeaderText("请输入名称前缀和起始编号:");
            prefixDialog.setContentText("名称前缀:");

            prefixDialog.showAndWait().ifPresent(prefix -> {
                TextInputDialog numberDialog = new TextInputDialog("1");
                numberDialog.setTitle("批量重命名");
                numberDialog.setHeaderText("请输入起始编号:");
                numberDialog.setContentText("起始编号:");

                numberDialog.showAndWait().ifPresent(startNumberStr -> {
                    int startNumber = Integer.parseInt(startNumberStr);
                    TextInputDialog digitsDialog = new TextInputDialog("4");
                    digitsDialog.setTitle("批量重命名");
                    digitsDialog.setHeaderText("请输入编号位数:");
                    digitsDialog.setContentText("编号位数:");

                    digitsDialog.showAndWait().ifPresent(digitsStr -> {
                        int digits = Integer.parseInt(digitsStr);
                        int count = startNumber;

                        for (File imageFile1 : selectedImages) {
                            String newName = prefix + String.format("%0" + digits + "d", count);
                            String extension = fileNameUtil.getFileExtension(imageFile1);
                            File newFile = new File(imageFile1.getParent(), newName + extension);

                            if (imageFile1.renameTo(newFile)) {
                                statusUtil.updateStatus(statusLabel,"已重命名: " + imageFile1.getName() + " 为 " + newFile.getName());
                            } else {
                                statusUtil.updateStatus(statusLabel,"重命名失败: " + imageFile1.getName());
                            }
                            count++;
                        }
                         // 更新缩略图
                    });
                });
            });
            initImages();
        } else {
            statusUtil.updateStatus(statusLabel,"没有选中的文件可以重命名");
        }
    }
    public ContextMenu getContextMenu() {
        return contextMenu;
    }
    public void setDirectory(File directory){
        this.directory=directory;
    }
}

